package controllers

import play.api._
import play.api.mvc._
import play.api.data._
import play.api.data.Forms._
import play.api.libs.ws._
import models._
import scala.xml._
import services._


object Instituicoes extends Controller {
  
  def index = Action{ implicit request =>
    Ok(views.html.instituicoes.index(InstituicaoService.list()))
  }
  
  def novo = Action{
    Ok(views.html.instituicoes.cadastrar(instituicaoForm))
  }
  
  def cadastrar = Action{ implicit request =>
    instituicaoForm.bindFromRequest.fold(
      formError => {BadRequest(views.html.instituicoes.cadastrar(formError))},
      instituicao => {
        InstituicaoService.create(instituicao)
        Redirect(routes.Instituicoes.index).flashing(("success","Instituição Cadastrada com Sucesso"))
      }
    )
  }
  
  def editar(instituicaoId: Int) = Action {
    val instituicao = InstituicaoService.getById(instituicaoId)
    Ok(views.html.instituicoes.editar(instituicaoForm.fill(instituicao)))
  }
  
  def atualizar(instituicaoId: Int) = Action { implicit request =>
      instituicaoForm.bindFromRequest.fold(
      formError => {BadRequest(views.html.instituicoes.editar(formError))},
      instituicao => {
        InstituicaoService.update(instituicao)
        Redirect(routes.Instituicoes.index).flashing(("success","Instituição Atualizada com Sucesso"))
      }
    )
  }
  
  def excluir(instituicaoId: Int) = Action{
    InstituicaoService.delete(instituicaoId)
    Redirect(routes.Instituicoes.index).flashing(("success","Instituição Excluida com Sucesso"))
  }
  
  val instituicaoForm = Form(
    mapping(
      "id" -> optional(number),
      "nome" -> nonEmptyText,
      "email" -> email,
      "endereco" ->optional(
          mapping(
            "id" -> optional(number),
            "logradouro" -> text,
            "complemento" -> text,
            "numero" -> text,
            "bairro" -> text,
            "cep" -> text,
            "estado" -> text,
            "cidade" -> text
          )(Endereco.apply)(Endereco.unapply)
      ),
      "telefones" -> list(
          mapping(
              "id" -> optional(number),
              "numero" -> text
          )(Telefone.apply)(Telefone.unapply)
      )
    )(Instituicao.apply)(Instituicao.unapply)
  )
}